#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <allegro.h>
#include <sys/time.h>
#include "../src/item.h"
#include "../src/fisica.h"
#include "../src/oceano.h"
#include "../src/grafico.h"
#include "../src/colisao.h"

void estatisticaVelocidade(float velMediaEsperada);

int finaliza(void);

volatile long speed_counter = 0; /*guarda o valor do contador de velocidade*/

void increment_speed_counter() /*incrementa o contador de velocidade*/
{
  speed_counter++; 
}
END_OF_FUNCTION(increment_speed_counter);


int main(int argc, char *argv[]) {
    float freq, velMedia;
    struct timespec requisitado;
    /*struct timeval start_time;
    struct timeval stop_time;
    long int timeLoop;*/
    long int cont;

    int semente;
    int frame_desenho = 0; 

    BITMAP *buffer = NULL;
    BITMAP *oceano = NULL;
    BITMAP *bote1Bit = NULL;
    BITMAP *bote2Bit = NULL;
    BITMAP *naufragoBit = NULL;
    BITMAP *asimovBit = NULL;
    BITMAP *coralPBit = NULL;
    BITMAP *coralMBit = NULL;
    BITMAP *coralGBit = NULL;
    BITMAP *anchorBit = NULL;

    /*argumentos de entrada*/
    if (argc == 2) {
        freq = atof (argv[1]);
        velMedia = 1;
        srand (time (NULL));
    }
    else if (argc == 3) {
        freq = atof (argv[1]);
        velMedia = atof (argv[2]);
        srand (time (NULL));
    }
    else if (argc == 4) {
        freq = atof (argv[1]);
        velMedia = atof (argv[2]);
        semente = atoi (argv[3]); 
        srand (semente);
    }
    /*parametros default*/
    else {
        freq = 0.5;
        velMedia = 3;
        srand (20);
    }

    setFreqGeraPassageiro(freq);
    setMediaDaVelocidadeGerada(velMedia,0.5);

    allegro_init();
    install_keyboard(); 
    install_timer();
    LOCK_VARIABLE(speed_counter);
    LOCK_FUNCTION(increment_speed_counter);
    install_int_ex(increment_speed_counter, BPS_TO_TIMER(30));
    set_color_depth(16);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, OC_SIZE_X,OC_SIZE_Y,0,0); 
    buffer = create_bitmap(OC_SIZE_X,OC_SIZE_Y);

    /*oceano = load_bitmap("oceano_azul.bmp", NULL);*/
    naufragoBit = load_bitmap("../grafico/naufrago.bmp", NULL);
    bote1Bit = load_bitmap("../grafico/bote1.bmp", NULL);
    bote2Bit = load_bitmap("../grafico/bote2.bmp", NULL);
    coralPBit = load_bitmap("../grafico/coral_pequeno.bmp", NULL);
    coralMBit = load_bitmap("../grafico/coral_medio.bmp", NULL);
    coralGBit = load_bitmap("../grafico/coral_grande.bmp", NULL);
    asimovBit = load_bitmap("../grafico/asimov.bmp", NULL);
    anchorBit = load_bitmap("../grafico/ancora.bmp", NULL);
    oceano = create_bitmap(OC_SIZE_X,OC_SIZE_Y);
    clear_to_color(oceano, makecol(0,0,128));

    limpaOceano (oceano, buffer);
			
    inicializaVetorNaufragos();
    inicializaBotes();
    naufragioAsimov();   /*coloca o naufragio em alguma posicao da tela*/
    populaCorais(30);
    populaNaufragos(30);
    criaBotes();
    inicializaEstruturaColisao();

    desenhaAsimov(buffer, asimovBit);
    desenhaCorais(buffer, coralPBit, coralMBit, coralGBit);
    desenhaNaufragos(buffer, naufragoBit);
    desenhaBotes(buffer, bote1Bit, bote2Bit, anchorBit);
    desenhaOceano (buffer, screen);
    show_info(screen);
    readkey();
    incrementaTempo(1);

    requisitado.tv_sec=0;
    cont=0;

    //while(numNaufragosNoVetor() > 0) {
    while(!key[KEY_ESC]){


	    while(speed_counter > 0) /*loop da parte logica, enquanto speedcounter >0*/
	    {
		    /*controle do jogador 1*/
		    if(key[KEY_LEFT]){
			    /*rotaciona para esquerda*/
			    rotacionaAntiHorario(0);
		    }
		    if(key[KEY_RIGHT]){
			    /*rotaciona para direita*/
			    rotacionaHorario(0);
		    }
		    if(key[KEY_DOWN]){
			    /*frea*/
			    freia(0);
		    }
		    if(key[KEY_UP]){
			    /*acelera*/
			    if(getAncora(0))
				    acelera(0);
		    }
		    if(key[KEY_ENTER]){
			    /*lanca ou recolhe ancora*/
			    ancora(0);
			    zeraVel(0);
			    if(getAncora(0))
				    descarregaPassageiros(0);
		    }
		    /* controle do jogador 2*/
		    if(key[KEY_A]){
			    /*rotaciona para a esqueda*/
			    rotacionaAntiHorario(1);
		    }
		    if(key[KEY_D]){
			    /*rotaciona para a direita*/
			    rotacionaHorario(1);
		    }
		    if(key[KEY_S]){
			    /*frea*/
			    freia(1);
		    }
		    if(key[KEY_W]){
			    /*acelera*/
			    if(getAncora(1))
				    acelera(1);
		    }
		    if(key[KEY_SPACE]){
			    /*lanca ou recolhe ancora*/
			    ancora(1);
			    zeraVel(1);
			    if(getAncora(1))
				    descarregaPassageiros(1);
		    }
		    speed_counter --;
		    frame_desenho++;
		    frame_desenho = frame_desenho % 2;   /*desenha a cada 10 quadros em 1 segundo*/
	    }

	    if (frame_desenho == 0){
		    calculaProximoEstadoParticulas();	
		    iteracaoParaProximoPasso();
		    limpaOceano (oceano, buffer);
		    desenhaAsimov(buffer, asimovBit);
		    desenhaCorais(buffer, coralPBit, coralMBit, coralGBit);
		    desenhaNaufragos(buffer, naufragoBit);
		    desenhaBotes(buffer, bote1Bit, bote2Bit, anchorBit);
		    show_info(buffer);
		    desenhaOceano (buffer, screen);
		    frequenciaGeracaoNaufrago();
                    if(finaliza())
                          break;
	    }
    } 

    imprime_fim(screen); 
    clear_keybuf();
    readkey();

    destroy_bitmap(buffer); 
    destroy_bitmap(oceano); 
    destroy_bitmap(naufragoBit);
    destroy_bitmap(bote1Bit);
    destroy_bitmap(bote2Bit);
    destroy_bitmap(coralPBit);
    destroy_bitmap(coralMBit);
    destroy_bitmap(coralGBit);
    destroy_bitmap(asimovBit);
    destroy_bitmap(anchorBit);

    return 0;
}
END_OF_MAIN()

int finaliza(void){
    if(getVidas(0) <= 0)
	return 1;
    if(getVidas(1) <= 0)
	return 1;
    return 0;
}

	/*lista parametros pedidos para teste*/
	void estatisticaVelocidade(float velMediaEsperada){
		float posx, posy, vx, vy, max, min, vel, dir, soma;
		int naufragos;
		naufrago *next, *primeiro;
		naufragos=0;
		soma=0;
		max=0;
		min=1.4;

		primeiro = nextNaufrago(); 
		next = primeiro;
		do {
			getNaufragoPosVel(next, &posx, &posy, &vx, &vy);
			euclidianoParaPolar (vx, vy, &dir, &vel);
			if(vel > max) max = vel;
			if(vel < min) min = vel;
			soma+=vel;
			naufragos++;
			next = nextNaufrago();
		} while(next != primeiro && next != NULL);
		printf("Velocida maxima = %g, minima = %g, media = %g, media esperada = %g\n", max, min, soma/(float) naufragos, velMediaEsperada);
	}

